package com.unknowpupil.design.relation;

import java.util.List;

/**
 * @Description: 组合(Composition)
 * <p>
 *     组合关系，是关联关系的一种，是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期，组合关系是不能共享的。
 *       代表整体的对象需要负责保持部分对象和存活，在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象，
 *       由后者负责此对象的生命周期。
 *       换言之，代表部分的对象在每一个时刻只能与一个对象发生组合关系，由后者排他地负责生命周期。部分和整体的生命周期一样。
 *
 *       组合关系用带实心菱形的实线来表示，菱形指向整体
 * </p>
 * @Author: <a> w10g </a>
 * @CreateDate: Create in 2020/4/24 11:40
 * @Classname: CompositionSchema
 * @Version: 1.0
 */
public class SchemaComposition {
    /**
     * 菜刀
     */
    static class Kinfe {
        public  void cutting(String name) {
            System.out.println("切" + name);
        }
    }

    /**
     *  厨师
     */
    class Chef {
        //管理 kinfe 生命周期
        Kinfe kinfe = new Kinfe();

        public void cutting(String vegetables) {
            kinfe.cutting(vegetables);
        }

    }

    public static void main(String[] args) {
        SchemaComposition compositionSchema = new SchemaComposition();
        Chef chef = compositionSchema.new Chef();


        chef.cutting("牛肉");


    }

    /**
     * =========另一种方式
     * =======
     * ====
     *  组合关系（Composition）
     * 组合关系(Composition)也表示类之间整体和部分的关系，但是组合关系中部分和整体具有统一的生存期。
     * 一旦整体对象不存在，部分对象也将不存在，部分对象与整体对象之 间具有同生共死的关系。
     * • 在组合关系中，成员类是整体类的一部分，而且整体类可以控制成员类的生命周期，即成员类的存在依赖于整体类。
     * 在UML中，组合关系用带实心菱形的直线表示。
     *
     * */

    public class Menu{
    }
    public class Window{
        private List<Menu> menus ;
    }

    /**
     *
     * 菜单的存在前提是窗口的存在，两者之间存在很强的拥有关系。且窗口对菜单的生命周期负责，
     * 只有在窗口创建之后，菜单才能够创建，菜单必须在窗口销毁之前销毁。
     * 因此Window与Menu之间是组合关系
     *
     */

}
